/*
计算相似度分数，包括分数1和分数2
当分数1不同时，分数1更高者更相似；当分数1相同时，分数2更高者更相似
分数越相似的病历排名越前，分数最相似的病历排第1名
- 分数1表示性别、年龄、诊断的相似程度：
	相同的性别1分，
	相同的年龄1分，
	首个相同的诊断3分，更多相同的诊断2.01分
- 分数2表示检查、用药的相似程度：
	首个相同的检查2.02分，更多相同的检查1分（检查只看阳性），
	首个相同的用药2.01分，更多相同的用药1分，如果用药的数量不同分数只有一半
*/

var diagnose_frequency_array = [];
var MLS_frequency_array = [];
var medicines_frequency_array = [];

class Validator {
	static sortByScore(srcCase,dstArray){
		var score_1 = 0;
		var score_2 = 0;
		console.log(srcCase);
		console.log("compare array length = ",dstArray.length);
		var score_array = [];



		dstArray.forEach(function(item,index){
			score_1 = validate_score_1(srcCase,dstArray[index]);
			score_2 = validate_score_2(srcCase,dstArray[index]);		
				
		  dstArray[index].diagnose = formatDiagnose(srcCase.diagnose,dstArray[index].diagnose);
		  dstArray[index].medicines = formatMedicines(srcCase.medicines,dstArray[index].medicines);
			
			var score_obj = {
				index:index,
				score_1:score_1,
				score_2:score_2,
				dst:dstArray[index]
			}
			score_array.push(score_obj);
		})
		
		score_array.sort(function(a,b){
			if(b.score_1 != a.score_1){
				return b.score_1-a.score_1;
			}else{
				return b.score_2-a.score_2;
			}
		})
		
		// diagnose_frequency_array.sort(function(a,b){
		// 	return b.count-a.count;
		// })
		// console.log(diagnose_frequency_array.slice(0,20));
		
		// MLS_frequency_array.sort(function(a,b){
		// 	return b.count - a.count;
		// })
		
		// console.log(MLS_frequency_array.slice(0,20));
		
		// medicines_frequency_array.sort(function(a,b){
		// 	return b.count - a.count;
		// })
		// console.log(medicines_frequency_array.slice(0,20));
		
		//console.log(score_array.slice(0,3));
		
		
		
		var result = [];
		score_array.forEach(function(item){
			result.push(item.dst);
		})
		return result;
	}

	
}

/*
- 分数1表示性别、年龄、诊断的相似程度：
	相同的性别1分，
	相同的年龄1分，
	首个相同的诊断3分，更多相同的诊断2.01分
*/

var validate_score_1 = function(src,dst){
	var score = 0;
	if(src.gender==dst.gender){
		score++;
	}
	
	if(src.age == dst.age){
		score++;
	}
	
	var count = 0;
	src.diagnose.forEach(function(value,index){
		dst.diagnose.forEach(function(dst_var){
			if(value == dst_var){
				if(count==0){
					score+=3;
				}else{
					score+=2.01;
				}
				count++;
			}	
		})
	});
	getDiagnoseFrequency(dst.diagnose);
	
	return score;
}

/*
- 分数2表示检查、用药的相似程度：
	首个相同的检查2.02分，更多相同的检查1分（检查只看阳性），
	首个相同的用药2.01分，更多相同的用药1分，如果用药的数量不同分数只有一半
*/
function validate_score_2(src,dst){
	var score = 0;

	var count = 0;
	src.MLS.forEach(function(item){
		if(item.positive){
			dst.MLS.forEach(function(dst_value){
				if(item.name==dst_value.name && dst_value.positive){
					if(count==0){
						score+=2.02;
					}else{
						score+=1;
					}
					count++;
				}
			})
		}
	})
	getMLSFrequency(dst.MLS);
	
	count =  0;
	src.medicines.forEach(function(item){
		if(item.dosis!=0){
			dst.medicines.forEach(function(dst_item){
				//只有当用药名字和单位都相同时
				if(item.name==dst_item.name&&item.unit==dst_item.unit){
			
					//第一次相同
					if(count==0){
						if(item.dosis == dst_item.dosis){
							score += 2.01;
						}else{
							score += 1.005;
						}
						
					}else{
						//第二次相同
						if(item.dosis == dst_item.dosis){
							score += 1;
						}else{
							score += 0.5;
						}
						
					}
					count++;
				}
			})
		}
	})
	getMedicinesFrequency(dst.medicines);
	
	return score;
}


function getDiagnoseFrequency(src_diagnose_array){
	src_diagnose_array.forEach(function(item){
		var find = false;
		diagnose_frequency_array.forEach(function(m_item){
			if(m_item.name == item){
				find = true;
				m_item.count++;
			}
		})
		if(!find){
			diagnose_frequency_array.push({
				name:item,
				count:1,
			})
		}
	})
}

function getMLSFrequency(src_MLS_array){
	src_MLS_array.forEach(function(item){
		var find = false;
		MLS_frequency_array.forEach(function(m_item){
			if(m_item.name == item.name){
				find = true;
				m_item.count++;
			}
		})
		if(!find){
			MLS_frequency_array.push({name:item.name,count:1});
		}
	})
}

function getMedicinesFrequency(src_Medicines_array){
	src_Medicines_array.forEach(function(item){
		var find = false;
		medicines_frequency_array.forEach(function(m_item){
			if(m_item.name==item.name){
				find = true;
				m_item.count++;
			}
		})
		if(!find){
			medicines_frequency_array.push({name:item.name,count:1});
		}
	})
}


var compare = function(prop){
	return function(a,b){
		return a.score_1 < b.score_1;
	}
}

/*
	format dianose
*/   
var formatDiagnose = function(tmpdg,Dst){
	 var head = Dst[0];
	 var result = Dst.slice(1,Dst.length);
	 result.sort(function(a,b){
	 	return (b.localeCompare(a,'zh-Hans-CN',{sensitivity:'accent'}))&&(a.length-b.length);
	 })
	 result.unshift(head);		
	var same = [];
	var headorderArray = [];
	var sameIndex = [];
	
	//找出和src相同的诊断并搬到same数组中
	result.forEach(function(dg,i){
		//删除空的诊断
		tmpdg.forEach(function(t,_i){
			if(t.length == 0){
				tmpdg.splice(_i,1);
			}
		})
					
		tmpdg.forEach(function(srcdg){
			if(dg==srcdg){
				sameIndex.push(i);
				same.push(dg);
			}
		})
	})
	//删除索引对应的诊断，注意索引后退的问题
	var count = 0;
	for(var i = 0;i < sameIndex.length;i++,count++){
		result.splice(sameIndex[i]-count,1);
	}

	//对same数组排序并存到headorderArray中
	tmpdg.forEach(function(srcdg){
		same.forEach(function(dstdg){
			if(srcdg==dstdg){
				headorderArray.push(srcdg);
			}
		})
	})
	
	headorderArray.reverse();
	headorderArray.forEach(function(dg){
		result.unshift(dg);
	})
	
   return result;
}

var formatMedicines = function(srcmd,dstmd){
	var same = [];
	var headorderArray = [];
	var sameIndex = [];
	var result = dstmd;
	result.forEach(function(item){
		srcmd.forEach(function(t,_i){
			if(t.name==item.name){
				sameIndex.push(i);
				same.push(item);
			}
		})
	})
	
	var count = 0;
	for(var i = 0;i<sameIndex.length;i++,count++){
		result.splice(sameIndex[i]-count,1);
	}
	
	srcmd.forEach(function(item){
		same.forEach(function(_item){
			if(item.name==_item.name){
				headorderArray.push(_item);
			}
		})
	})
	
	headorderArray.reverse();
	headorderArray.forEach(function(item){
		result.unshift(item);
	})
	
	return result;
}

module.exports = Validator;